
package com.smartfit;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.smartfit.AccelerometerSensorActivity;
import com.smartfit.AccelValueFileData;
import com.smartfit.Axis3f;

public class RegisterActivity extends AccelerometerSensorActivity implements OnClickListener
{
	//
	private enum RegisterState
	{
		DEFAULT ,
		PRESS_START_BUTTON ,
		PRESS_STOP_BUTTON ,
		PRESS_GENERATE_BUTTON
	};
	
	// 데이터 ID
	private int m_iExamplarID = 0;
	// 현재 작업 중인 데이터
	private AccelValueFileData m_AccelValueFileData = new AccelValueFileData();
	
	TextView m_AccelValue;
	
	@Override
	protected void onCreate( Bundle savedInstanceState )
	{
		// TODO Auto-generated method stub
		super.onCreate( savedInstanceState );
		setContentView( R.layout.register_activity );

		// 센서 초기화
		InitializeSensor();
		
		// 버튼생성
		CreateRadioButtons();

		// 아이디 초기값 설정
		GetID();
		
		// 대표값 정보 로드 버튼
		Button btnRegLoad = ( Button )findViewById( R.id.RegLoadButton );
		btnRegLoad.setOnClickListener( this );

		// 센서 정보 저장 시작
		Button btnRegStart = ( Button )findViewById( R.id.RegStartButton );
		btnRegStart.setOnClickListener( this );
		// 센서 정보 저장 종료
		Button btnRegStop = ( Button )findViewById( R.id.RegStopButton );
		btnRegStop.setOnClickListener( this );
		
		// 대표값 생성
		Button btnRegGenerate = ( Button )findViewById( R.id.RegGenerateExamplarButton );
		btnRegGenerate.setOnClickListener( this );
		
		// 등록화면에서 메인화면으로 전환
		Button btnMain = ( Button )findViewById( R.id.RegMainButton );
		btnMain.setOnClickListener( this );

		// 버튼 활성화 처리
		ControlButton( RegisterState.DEFAULT );
		
		// 현재 대표값 로딩
		LoadExamplarInfo();
		
		m_AccelValue = ( TextView )findViewById( R.id.reg_acc_value );
	}
	
	private void CreateRadioButtons()
	{
		RadioGroup rd = ( RadioGroup )findViewById( R.id.pattern_select_radio_group );
		
		rd.setOnCheckedChangeListener( 
				new android.widget.RadioGroup.OnCheckedChangeListener()
				{
					@Override
					public void onCheckedChanged( RadioGroup arg0 , int arg1 )
					{
						// TODO Auto-generated method stub
						switch ( arg0.getCheckedRadioButtonId() )
						{
							case R.id.pattern_01_button:
								
								m_iExamplarID = 0;
								
								break;

							case R.id.pattern_02_button:
								
								m_iExamplarID = 1;

								break;

							case R.id.pattern_03_button:
								
								m_iExamplarID = 2;

								break;

							case R.id.pattern_04_button:
								
								m_iExamplarID = 3;

								break;

							case R.id.pattern_05_button:
								
								m_iExamplarID = 4;

								break;
						}
					}
				}
			);
	}
	
	@SuppressLint("NewApi")
	private void GetID()
	{
		EditText editText = ( EditText )findViewById( R.id.reg_id_value );
		{
			String s = editText.getText().toString();

			if ( s.isEmpty() )
			{
				m_iExamplarID = 0; 
			}
			else
			{
				m_iExamplarID = Integer.parseInt( s );
			}			
		}
	}
	
	private void ShowExamplarInfo( int iExamplarID )
	{
		TextView text = ( TextView )findViewById( R.id.reg_loaded_id_info );
		
		text.setText( "Loaded ID : " + Integer.toString( m_iExamplarID ) );
	}

	private void LoadExamplarInfo()
	{
		// 아이디 얻기
		GetID();
		// 아이디와 연결된 데이터 로딩
		SmartFitApp app = ( ( SmartFitApp )getApplicationContext() );
		if ( app.m_ExamplarDB.IsExistExamplar( m_iExamplarID ) == false )
		{
			// 생성
			app.m_ExamplarDB.CreateExamplar( m_iExamplarID );
			// config 파일 업데이트
			app.m_ExamplarDB.WriteConfigFile();
		}
		
		// 현재 지정된 아이디의 대표값 정보 표시
		ShowExamplarInfo( m_iExamplarID );
	}

	@Override
	public void onClick( View v )
	{
		// TODO Auto-generated method stub
		switch ( v.getId() )
		{
			case R.id.RegLoadButton:
			{
				LoadExamplarInfo();
				
				break;
			}
			
			case R.id.RegStartButton:
				
				ClickStartButton();
				
				break;

			case R.id.RegStopButton:
				
				ClickStopButton();
				
				break;
			
			case R.id.RegGenerateExamplarButton:
			{
				ClickGenerateButton();

				break;
			}
			
			case R.id.RegMainButton:
				
				finish();
				
				break;
		}
	}

	private void ClickStartButton()
	{
		SmartFitApp app = ( ( SmartFitApp )getApplicationContext() );
		
		if ( app.m_ExamplarDB.IsExistExamplar( m_iExamplarID ) )
		{
			// 센서 연동 시작
			StartSensor();
		}
		else
		{
			// 해당 아이디 config 파일 없음
			// "LOAD" 버튼 먼저 클릭 팝업
			ShowNoticeMessageBox( "Click LOAD first!" );
		}
	}

	private void ClickStopButton()
	{
		// 센서 데이터 수집 종료
		DisconnectSensor();
		
		//
		
		Axis3f distance = m_AccelValueFileData.GetDistance();
		
		String s = "x = " + m_DecimalFormat.format( distance.x ) + " , y = " + m_DecimalFormat.format( distance.y ) + " , z = " + m_DecimalFormat.format( distance.z );
		m_AccelValue.setText( s );

		// 데이터에 중력값을 포함할 지 유무
		m_AccelValueFileData.m_bIsContainedGravity = m_bIsContainedGravity;
		// 샘플 데이터 정보 설정
		m_AccelValueFileData.m_iTimeInterval = m_iTimeInterval;

		//
		// 데이터 저장
		//
		
		SmartFitApp app = ( ( SmartFitApp )getApplicationContext() );

		Examplar e = app.m_ExamplarDB.GetExamplar( m_iExamplarID );
		
		if ( e == null )
		{
			e = app.m_ExamplarDB.CreateExamplar( m_iExamplarID );
		}

		e.WriteSampleFile( app.m_ExamplarDB.GetDataPath() , m_AccelValueFileData );
		
		// 버튼 활성화 처리
		ControlButton( RegisterState.PRESS_STOP_BUTTON );
	}
	
	private void ClickGenerateButton()
	{
		SmartFitApp app = ( ( SmartFitApp )getApplicationContext() );
		
		Examplar e = app.m_ExamplarDB.GetExamplar( m_iExamplarID );
		
		if ( e.GenerateExamplar( app.m_ExamplarDB.GetDataPath() , app.m_ExamplarDB.GetNumMaxExamplars() ) )
		{
			ShowNoticeMessageBox( "Generated!" );
		}
		else
		{
			ShowNoticeMessageBox( "Failed!" );
		}
	}

	@Override
	public boolean onKeyDown( int keyCode , KeyEvent event )
	{
		switch ( keyCode )
		{
			case KeyEvent.KEYCODE_VOLUME_UP:
				
				ClickStartButton();
				
				return true;
				
			case KeyEvent.KEYCODE_VOLUME_DOWN:
				
				ClickStopButton();
				
				return true;
				
			case KeyEvent.KEYCODE_BACK:
				
				break;
		}
		
		// TODO Auto-generated method stub
		return super.onKeyDown(keyCode, event);
	}

	@Override
	public void NotifySensorEvent( AccelSensorData sensorData )
	{
	}
	
	@Override
	public void NotifySensorOrientationEvent( double x , double y , double z )
	{
		// TODO Auto-generated method stub
		
		String s = "x = " + m_DecimalFormat.format( x ) + " , y = " + m_DecimalFormat.format( y ) + " , z = " + m_DecimalFormat.format( z );
		m_AccelValue.setText( s );

		m_AccelValueFileData.Set( AccelValueFileData.DATA_TYPE_ANGLE , x , y , z );
	}
	
	@Override
	public void NotifySensorDistanceEvent( double x , double y , double z )
	{
		// TODO Auto-generated method stub
		
		m_AccelValueFileData.Set( AccelValueFileData.DATA_TYPE_DISTANCE , x , y , z );
	}
	
	private void ControlButton( RegisterState eState )
	{
		Button btnRegLoad = ( Button )findViewById( R.id.RegLoadButton );
		Button btnRegStart = ( Button )findViewById( R.id.RegStartButton );
		Button btnRegStop = ( Button )findViewById( R.id.RegStopButton );
		Button btnRegGenerate = ( Button )findViewById( R.id.RegGenerateExamplarButton );

		switch ( eState )
		{
			case PRESS_START_BUTTON:
				
				btnRegLoad.setEnabled( false );
				btnRegStart.setEnabled( false );
				btnRegStop.setEnabled( true );
				btnRegGenerate.setEnabled( false );

				break;
				
			case PRESS_STOP_BUTTON:

				btnRegLoad.setEnabled( true );
				btnRegStart.setEnabled( true );
				btnRegStop.setEnabled( false );
				btnRegGenerate.setEnabled( true );
				
				break;
				
			default:
				
				btnRegLoad.setEnabled( true );
				btnRegStart.setEnabled( true );
				btnRegStop.setEnabled( false );
				btnRegGenerate.setEnabled( true );

				break;
		}
	}
	
	private void StartSensor()
	{
		// 새로 데이터 저장 시작
		m_AccelValueFileData.Clear();

		// 센서 데이터 수집 시작
		ConnectSensor();
		
		/*/
		// 테스트
		for ( int i = 1 ; i < 101 ; i++ )
		{
			m_AccelValueFileData.m_iTimeInterval = 100;
			m_AccelValueFileData.Set( 1.2 * i , 1.3 * i , 1.4 * i );
		}
		/**/

		// 버튼 활성화 처리
		ControlButton( RegisterState.PRESS_START_BUTTON );
	}
	
	private void ShowReplaceMessageBox()
	{
		AlertDialog.Builder alertDlg = new AlertDialog.Builder( this );
		
		alertDlg.setTitle( "Notice" );
		
		alertDlg.setPositiveButton( "OK" , 
			new DialogInterface.OnClickListener()
			{
			    @Override
			    public void onClick( DialogInterface dialog , int which )
			    {
			    	// 센서 연동 시작
			    	StartSensor();
			    }
			}
		);
		
		alertDlg.setNegativeButton( "Cancel" , 
			new DialogInterface.OnClickListener()
			{
			    @Override
			    public void onClick( DialogInterface dialog , int which )
			    {
			    }
			}
		);

		alertDlg.setMessage( "Replace?" );
		alertDlg.show();
	}

	private void ShowNoticeMessageBox( String strMessage )
	{
		AlertDialog.Builder alertDlg = new AlertDialog.Builder( this );
		
		alertDlg.setTitle( "Notice" );
		alertDlg.setPositiveButton( "OK" ,
				new DialogInterface.OnClickListener()
				{
				    @Override
				    public void onClick( DialogInterface dialog , int which )
				    {
				    	dialog.dismiss();
				    }
			    }
		);
		alertDlg.setMessage( strMessage );
		alertDlg.show();
	}
}
